using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._NetworkAnalystTools._Analysis
{
    /// <summary>
    /// <para>Update Analysis Layer Attribute Parameter</para>
    /// <para>Updates the network attribute parameter value for a network analysis layer. The tool should be used to update the value of an attribute parameter for a network analysis layer prior to solving with the Solve tool.  This ensures that the  solve operation uses the specified value of the attribute parameter to produce appropriate results.</para>
    /// <para>更新网络分析图层的网络属性参数值。在使用求解工具求解之前，应使用该工具更新网络分析图层的属性参数值。 这可确保求解操作使用属性参数的指定值来生成适当的结果。</para>
    /// </summary>    
    [DisplayName("Update Analysis Layer Attribute Parameter")]
    public class UpdateAnalysisLayerAttributeParameter : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public UpdateAnalysisLayerAttributeParameter()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_network_analysis_layer">
        /// <para>Input Network Analysis Layer</para>
        /// <para>Network analysis layer for which the attribute parameter value will be updated.</para>
        /// <para>将更新其属性参数值的网络分析图层。</para>
        /// </param>
        /// <param name="_parameterized_attribute">
        /// <para>Attribute</para>
        /// <para>The network attribute whose attribute parameter will be updated.</para>
        /// <para>将更新其属性参数的网络属性。</para>
        /// </param>
        /// <param name="_attribute_parameter_name">
        /// <para>Parameter</para>
        /// <para>The parameter of the network attribute that will be updated. The parameters of type Object cannot be updated using the tool.</para>
        /// <para>将要更新的网络属性的参数。无法使用该工具更新对象类型的参数。</para>
        /// </param>
        public UpdateAnalysisLayerAttributeParameter(object _in_network_analysis_layer, object _parameterized_attribute, object _attribute_parameter_name)
        {
            this._in_network_analysis_layer = _in_network_analysis_layer;
            this._parameterized_attribute = _parameterized_attribute;
            this._attribute_parameter_name = _attribute_parameter_name;
        }
        public override string ToolboxName => "Network Analyst Tools";

        public override string ToolName => "Update Analysis Layer Attribute Parameter";

        public override string CallName => "na.UpdateAnalysisLayerAttributeParameter";

        public override List<string> AcceptEnvironments => ["workspace"];

        public override object[] ParameterInfo => [_in_network_analysis_layer, _parameterized_attribute, _attribute_parameter_name, _attribute_parameter_value, _output_layer];

        /// <summary>
        /// <para>Input Network Analysis Layer</para>
        /// <para>Network analysis layer for which the attribute parameter value will be updated.</para>
        /// <para>将更新其属性参数值的网络分析图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Network Analysis Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_network_analysis_layer { get; set; }


        /// <summary>
        /// <para>Attribute</para>
        /// <para>The network attribute whose attribute parameter will be updated.</para>
        /// <para>将更新其属性参数的网络属性。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Attribute")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _parameterized_attribute { get; set; }


        /// <summary>
        /// <para>Parameter</para>
        /// <para>The parameter of the network attribute that will be updated. The parameters of type Object cannot be updated using the tool.</para>
        /// <para>将要更新的网络属性的参数。无法使用该工具更新对象类型的参数。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Parameter")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _attribute_parameter_name { get; set; }


        /// <summary>
        /// <para>Value</para>
        /// <para><xdoc>
        ///   <para>The value that will be set for the attribute parameter. It can be a string, number, date, or Boolean (True, False). If the value is not specified, then the attribute parameter value is set to Null.</para>
        ///   <para>If the attribute parameter has a restriction usage type, the value can be specified as a string keyword or a numeric value. The string keyword or the numeric value determines whether the restriction attribute prohibits, avoids, or prefers the network elements it is associated with. Furthermore, the degree to which network elements are avoided or preferred can be defined by choosing HIGH, MEDIUM, or LOW keywords. The following keywords are supported:</para>
        ///   <bulletList>
        ///     <bullet_item>PROHIBITED</bullet_item><para/>
        ///     <bullet_item>AVOID_HIGH</bullet_item><para/>
        ///     <bullet_item>AVOID_MEDIUM</bullet_item><para/>
        ///     <bullet_item>AVOID_LOW</bullet_item><para/>
        ///     <bullet_item>PREFER_LOW</bullet_item><para/>
        ///     <bullet_item>PREFER_MEDIUM</bullet_item><para/>
        ///     <bullet_item>PREFER_HIGH</bullet_item><para/>
        ///   </bulletList>
        ///   <para>Numeric values that are greater than one cause restricted elements to be avoided; the larger the number, the more the elements are avoided. Numeric values between zero and one cause restricted elements to be preferred; the smaller the number, the more restricted elements are preferred. Negative numbers prohibit restricted elements.</para>
        ///   <para>If the parameter value holds an array, separate the items in the array with the localized separator character. For example, in the U.S., you would most likely use the comma character to separate the items. So representing an array of three numbers might look like the following: "5,10,15".</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将为属性参数设置的值。它可以是字符串、数字、日期或布尔值（True、False）。如果未指定该值，则属性参数值将设置为 Null。</para>
        ///   <para>如果属性参数具有限制使用类型，则可以将该值指定为字符串关键字或数值。string 关键字或数值确定限制属性是禁止、避免还是首选与其关联的网络元素。此外，可以通过选择 HIGH、MEDIUM 或 LOW 关键字来定义避免或首选网络元素的程度。支持以下关键字：</para>
        ///   <bulletList>
        ///     <bullet_item>禁止</bullet_item><para/>
        ///     <bullet_item>AVOID_HIGH</bullet_item><para/>
        ///     <bullet_item>AVOID_MEDIUM</bullet_item><para/>
        ///     <bullet_item>AVOID_LOW</bullet_item><para/>
        ///     <bullet_item>PREFER_LOW</bullet_item><para/>
        ///     <bullet_item>PREFER_MEDIUM</bullet_item><para/>
        ///     <bullet_item>PREFER_HIGH</bullet_item><para/>
        ///   </bulletList>
        ///   <para>大于 1 的数值会导致避免受限制的元素;数字越大，避免的元素就越多。介于 0 和 1 之间的数值会导致首选受限元素;数量越小，首选的受限元素越多。负数禁止限制元素。</para>
        ///   <para>如果参数值包含数组，请使用本地化的分隔符分隔数组中的项。例如，在美国，您很可能会使用逗号字符来分隔项目。因此，表示三个数字的数组可能如下所示：“5,10,15”。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Value")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _attribute_parameter_value { get; set; } = null;


        /// <summary>
        /// <para>Updated Input Network Analysis Layer</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Updated Input Network Analysis Layer")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _output_layer { get; set; }


        public UpdateAnalysisLayerAttributeParameter SetEnv(object workspace = null)
        {
            base.SetEnv(workspace: workspace);
            return this;
        }

    }

}